package org.example.service;

import org.example.entity.SystemConfig;
import org.example.repository.SystemConfigRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 系统配置服务类
 */
@Service
@Transactional
public class SystemConfigService {
    
    @Autowired
    private SystemConfigRepository systemConfigRepository;
    
    /**
     * 创建系统配置
     */
    public SystemConfig createConfig(SystemConfig config) {
        // 检查配置键是否已存在
        if (systemConfigRepository.existsByConfigKey(config.getConfigKey())) {
            throw new RuntimeException("配置键已存在");
        }
        
        return systemConfigRepository.save(config);
    }
    
    /**
     * 根据ID查找配置
     */
    @Transactional(readOnly = true)
    public Optional<SystemConfig> findById(Long id) {
        return systemConfigRepository.findById(id);
    }
    
    /**
     * 根据配置键查找配置
     */
    @Transactional(readOnly = true)
    public Optional<SystemConfig> findByConfigKey(String configKey) {
        return systemConfigRepository.findByConfigKey(configKey);
    }
    
    /**
     * 获取所有配置
     */
    @Transactional(readOnly = true)
    public List<SystemConfig> findAllConfigs() {
        return systemConfigRepository.findAll();
    }
    
    /**
     * 根据配置键搜索
     */
    @Transactional(readOnly = true)
    public List<SystemConfig> searchConfigsByKey(String key) {
        return systemConfigRepository.findByConfigKeyContaining(key);
    }
    
    /**
     * 根据描述搜索配置
     */
    @Transactional(readOnly = true)
    public List<SystemConfig> searchConfigsByDescription(String description) {
        return systemConfigRepository.findByDescriptionContaining(description);
    }
    
    /**
     * 更新配置
     */
    public SystemConfig updateConfig(SystemConfig config) {
        SystemConfig existingConfig = systemConfigRepository.findById(config.getId())
                .orElseThrow(() -> new RuntimeException("配置不存在"));
        
        if (config.getConfigValue() != null) {
            existingConfig.setConfigValue(config.getConfigValue());
        }
        if (config.getDescription() != null) {
            existingConfig.setDescription(config.getDescription());
        }
        
        return systemConfigRepository.save(existingConfig);
    }
    
    /**
     * 根据配置键更新配置值
     */
    public SystemConfig updateConfigByKey(String configKey, String configValue) {
        SystemConfig config = systemConfigRepository.findByConfigKey(configKey)
                .orElseThrow(() -> new RuntimeException("配置不存在"));
        
        config.setConfigValue(configValue);
        return systemConfigRepository.save(config);
    }
    
    /**
     * 获取配置值
     */
    @Transactional(readOnly = true)
    public String getConfigValue(String configKey) {
        return systemConfigRepository.findByConfigKey(configKey)
                .map(SystemConfig::getConfigValue)
                .orElse(null);
    }
    
    /**
     * 获取配置值，如果不存在返回默认值
     */
    @Transactional(readOnly = true)
    public String getConfigValue(String configKey, String defaultValue) {
        return systemConfigRepository.findByConfigKey(configKey)
                .map(SystemConfig::getConfigValue)
                .orElse(defaultValue);
    }
    
    /**
     * 删除配置
     */
    public void deleteConfig(Long configId) {
        if (!systemConfigRepository.existsById(configId)) {
            throw new RuntimeException("配置不存在");
        }
        systemConfigRepository.deleteById(configId);
    }
    
    /**
     * 根据配置键删除配置
     */
    public void deleteConfigByKey(String configKey) {
        SystemConfig config = systemConfigRepository.findByConfigKey(configKey)
                .orElseThrow(() -> new RuntimeException("配置不存在"));
        
        systemConfigRepository.delete(config);
    }
}
